package pe.com.cotelasa.scp.entidad;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.persistence.Transient;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

@Entity
@Table(name = "orden_compra_servicio", catalog = "bdcotelasa", schema = "cotelasa")
@NamedQueries({
    @NamedQuery(name = "OrdenCompraServicio.findAll", query = "SELECT o FROM OrdenCompraServicio o"),
    @NamedQuery(name = "OrdenCompraServicio.findById", query = "SELECT o FROM OrdenCompraServicio o WHERE o.id = :id"),
    @NamedQuery(name = "OrdenCompraServicio.findByTipo", query = "SELECT o FROM OrdenCompraServicio o WHERE o.tipo = :tipo"),
    @NamedQuery(name = "OrdenCompraServicio.findByServicio", query = "SELECT o FROM OrdenCompraServicio o WHERE o.servicio = :servicio"),
    @NamedQuery(name = "OrdenCompraServicio.findByCategoria", query = "SELECT o FROM OrdenCompraServicio o WHERE o.categoria = :categoria"),
    @NamedQuery(name = "OrdenCompraServicio.findByCodigo", query = "SELECT o FROM OrdenCompraServicio o WHERE o.codigo = :codigo"),
    @NamedQuery(name = "OrdenCompraServicio.findByDescripcion", query = "SELECT o FROM OrdenCompraServicio o WHERE o.descripcion = :descripcion"),
    @NamedQuery(name = "OrdenCompraServicio.findByProductoPedido", query = "SELECT o FROM OrdenCompraServicio o WHERE o.productoPedido = :productoPedido"),
    @NamedQuery(name = "OrdenCompraServicio.findByFechaEmision", query = "SELECT o FROM OrdenCompraServicio o WHERE o.fechaEmision = :fechaEmision"),
    @NamedQuery(name = "OrdenCompraServicio.findByContacto", query = "SELECT o FROM OrdenCompraServicio o WHERE o.contacto = :contacto"),
    @NamedQuery(name = "OrdenCompraServicio.findByDireccion", query = "SELECT o FROM OrdenCompraServicio o WHERE o.direccion = :direccion"),
    @NamedQuery(name = "OrdenCompraServicio.findByTelefono", query = "SELECT o FROM OrdenCompraServicio o WHERE o.telefono = :telefono"),
    @NamedQuery(name = "OrdenCompraServicio.findBySubtotal", query = "SELECT o FROM OrdenCompraServicio o WHERE o.subtotal = :subtotal"),
    @NamedQuery(name = "OrdenCompraServicio.findByIgv", query = "SELECT o FROM OrdenCompraServicio o WHERE o.igv = :igv"),
    @NamedQuery(name = "OrdenCompraServicio.findByTotal", query = "SELECT o FROM OrdenCompraServicio o WHERE o.total = :total"),
    @NamedQuery(name = "OrdenCompraServicio.findByPlazoEntrega", query = "SELECT o FROM OrdenCompraServicio o WHERE o.plazoEntrega = :plazoEntrega"),
    @NamedQuery(name = "OrdenCompraServicio.findByDiasPlazo", query = "SELECT o FROM OrdenCompraServicio o WHERE o.diasPlazo = :diasPlazo"),
    @NamedQuery(name = "OrdenCompraServicio.findByExpresionTotal", query = "SELECT o FROM OrdenCompraServicio o WHERE o.diasPlazo = :expresionTotal"),
    @NamedQuery(name = "OrdenCompraServicio.findByLugarEntrega", query = "SELECT o FROM OrdenCompraServicio o WHERE o.lugarEntrega = :lugarEntrega"),
    @NamedQuery(name = "OrdenCompraServicio.findByTipoPago", query = "SELECT o FROM OrdenCompraServicio o WHERE o.tipoPago = :tipoPago"),
    @NamedQuery(name = "OrdenCompraServicio.findByDiasPago", query = "SELECT o FROM OrdenCompraServicio o WHERE o.diasPago = :diasPago"),
    @NamedQuery(name = "OrdenCompraServicio.findByDiasLibres", query = "SELECT o FROM OrdenCompraServicio o WHERE o.diasLibres = :diasLibres"),
    @NamedQuery(name = "OrdenCompraServicio.findByDetallePago", query = "SELECT o FROM OrdenCompraServicio o WHERE o.detallePago = :detallePago"),
    @NamedQuery(name = "OrdenCompraServicio.findByObservacion", query = "SELECT o FROM OrdenCompraServicio o WHERE o.observacion = :observacion"),
    @NamedQuery(name = "OrdenCompraServicio.findByEstadoOrden", query = "SELECT o FROM OrdenCompraServicio o WHERE o.estadoOrden = :estadoOrden"),
    @NamedQuery(name = "OrdenCompraServicio.findByEstadoRegistro", query = "SELECT o FROM OrdenCompraServicio o WHERE o.estadoRegistro = :estadoRegistro"),
    @NamedQuery(name = "OrdenCompraServicio.findByUsrCreacion", query = "SELECT o FROM OrdenCompraServicio o WHERE o.usrCreacion = :usrCreacion"),
    @NamedQuery(name = "OrdenCompraServicio.findByFecCreacion", query = "SELECT o FROM OrdenCompraServicio o WHERE o.fecCreacion = :fecCreacion"),
    @NamedQuery(name = "OrdenCompraServicio.findByUsrModificacion", query = "SELECT o FROM OrdenCompraServicio o WHERE o.usrModificacion = :usrModificacion"),
    @NamedQuery(name = "OrdenCompraServicio.findByFecModificacion", query = "SELECT o FROM OrdenCompraServicio o WHERE o.fecModificacion = :fecModificacion"),
    @NamedQuery(name = "OrdenCompraServicio.findByUsrEmision", query = "SELECT o FROM OrdenCompraServicio o WHERE o.usrEmision = :usrEmision")})
public class OrdenCompraServicio implements Serializable {

    
    @Id
    @SequenceGenerator(name = "generadorOrdenCompraServicio", sequenceName = "cotelasa.orden_compra_servicio_id_seq")
    @GeneratedValue(generator = "generadorOrdenCompraServicio")
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    
    @Basic(optional = false)
    @Column(name = "tipo")
    private char tipo;
    
    @Column(name = "servicio")
    private String servicio;
    
    @Column(name = "categoria")
    private String categoria;
    
    @Column(name = "codigo")
    private String codigo;
    
    @Column(name = "fecha_emision")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaEmision;
    
    @Column(name = "contacto")
    private String contacto;
    
    @Column(name = "direccion")
    private String direccion;
    
    @Column(name = "observacion")
    private String observacion;
    
    @Column(name = "comentario_edicion")
    private String comentarioEdicion;
    
    @Column(name = "telefono")
    private String telefono;
    
    // @Max(value=?) @Min(value=?)//if you know range of your decimal fields
    // consider using these annotations to enforce field validation
    @Column(name = "subtotal")
    private BigDecimal subtotal;
    
    @Column(name = "igv")
    private BigDecimal igv;
    
    @Column(name = "total")
    private BigDecimal total;
    
    @Column(name = "porcentaje_merma")
    private BigDecimal porcentajeMerma;
    
    @Column(name = "plazo_entrega")
    @Temporal(TemporalType.TIMESTAMP)
    private Date plazoEntrega;
    
    @Column(name = "fecha_cierre")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaCierre;
    
    @Column(name = "dias_plazo")
    private Integer diasPlazo;
    
    @Column(name = "expresion_total")
    private String expresionTotal;
    
    @Column(name = "lugar_entrega")
    private String lugarEntrega;
    
    @Column(name = "descripcion")
    private String descripcion;
    
    @Column(name = "producto_pedido")
    private String productoPedido;
    
    @Basic(optional = false)
    @Column(name = "tipo_pago")
    private String tipoPago;
    
    @Column(name = "dias_pago")
    private Integer diasPago;
    
    @Column(name = "dias_libres")
    private Integer diasLibres;
    
    @Column(name = "detalle_pago")
    private String detallePago;
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "crear_partidas")
    private short crearPartidas;
        
    
    @Basic(optional = false)
    @Column(name = "estado_orden")
    private String estadoOrden;
    
    @Basic(optional = false)
    @Column(name = "estado_registro")
    private char estadoRegistro;
    
    @Column(name = "usr_emision")
    private String usrEmision;
    
    @Basic(optional = false)
    @Column(name = "usr_creacion")
    private String usrCreacion;
    
    @Basic(optional = false)
    @Column(name = "fec_creacion")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fecCreacion;
    
    @Column(name = "usr_modificacion")
    private String usrModificacion;
    
    @Column(name = "fec_modificacion")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fecModificacion;
    
    @Column(name = "cantidad_total")
    private BigDecimal cantidadTotal;
    
    @Column(name = "unidad")
    private String unidad;
    
    @Column(name = "es_importacion")
    private Short esImportacion;
    
    @JoinColumn(name = "id_tipo_moneda", referencedColumnName = "id")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private TipoMoneda idTipoMoneda;
    
    @JoinColumn(name = "id_proveedor", referencedColumnName = "id")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Proveedor idProveedor;
    
    @JoinColumn(name = "id_orden_pedido", referencedColumnName = "id")
    @ManyToOne(fetch = FetchType.LAZY)
    private OrdenPedido idOrdenPedido;
    
    @JoinColumn(name = "id_empresa", referencedColumnName = "id")
    @ManyToOne(optional = false,fetch=FetchType.LAZY)
    //@LazyCollection(LazyCollectionOption.FALSE)
    private Empresa idEmpresa;
    
    
    @JoinColumn(name = "id_categoria_articulo", referencedColumnName = "id")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private CategoriaArticulo idCategoriaArticulo;
    
    @OneToMany(mappedBy = "idOrdenCompraServicio", fetch = FetchType.LAZY)
    private Collection<GuiaRemision> guiaRemisionCollection;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idOrdenCompraServicio", fetch = FetchType.LAZY)
    private Collection<DetalleOrdenCompraServicio> detalleOrdenCompraServicioCollection;
    
    @OneToMany(mappedBy = "idOrdenCompraServicio", fetch = FetchType.LAZY)
    private Collection<CompraFacturacion> compraFacturasCollection;
    
    @JoinColumn(name = "id_forma_pago", referencedColumnName = "id")
    @ManyToOne(optional = false,fetch=FetchType.LAZY)
    private TipoFormaPago formaPago;

    public OrdenCompraServicio() {
    }

    public OrdenCompraServicio(Integer id) {
        this.id = id;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public String getProductoPedido() {
        return productoPedido;
    }

    public void setProductoPedido(String productoPedido) {
        this.productoPedido = productoPedido;
    }

    public Collection<CompraFacturacion> getCompraFacturasCollection() {
        return compraFacturasCollection;
    }

    public void setCompraFacturasCollection(Collection<CompraFacturacion> compraFacturasCollection) {
        this.compraFacturasCollection = compraFacturasCollection;
    }

    public BigDecimal getPorcentajeMerma() {
        return porcentajeMerma;
    }

    public void setPorcentajeMerma(BigDecimal porcentajeMerma) {
        this.porcentajeMerma = porcentajeMerma;
    }

    public short getCrearPartidas() {
        return crearPartidas;
    }

    public void setCrearPartidas(short crearPartidas) {
        this.crearPartidas = crearPartidas;
    }

    public String getComentarioEdicion() {
        return comentarioEdicion;
    }

    public void setComentarioEdicion(String comentarioEdicion) {
        this.comentarioEdicion = comentarioEdicion;
    }

    public TipoFormaPago getFormaPago() {
        return formaPago;
    }

    public void setFormaPago(TipoFormaPago formaPago) {
        this.formaPago = formaPago;
    }

    public BigDecimal getCantidadTotal() {
        return cantidadTotal;
    }

    public void setCantidadTotal(BigDecimal cantidadTotal) {
        this.cantidadTotal = cantidadTotal;
    }

    public String getUnidad() {
        return unidad;
    }

    public void setUnidad(String unidad) {
        this.unidad = unidad;
    }

    public Short getEsImportacion() {
        return esImportacion;
    }

    public void setEsImportacion(Short esImportacion) {
        this.esImportacion = esImportacion;
    }

    public enum ESTADO_ORDEN_SC {

        BORRADOR('B'), ABIERTO('A'), CERRADO('C'), ANULADO('N');
        private char estado;

        private ESTADO_ORDEN_SC(char estado) {
            this.estado = estado;
        }

        public char getValor() {
            return estado;
        }
    }
    
    @Transient
	public String getDescEstadoGuia() {
		switch (estadoOrden.charAt(0)) {
			case 'A':
				return ESTADO_ORDEN_SC.ABIERTO.name();
			case 'C':
				return ESTADO_ORDEN_SC.CERRADO.name();
                        case 'N':
				return ESTADO_ORDEN_SC.ANULADO.name();
			default:
				return ESTADO_ORDEN_SC.BORRADOR.name();
		}
	}

    public OrdenCompraServicio(Integer id, char tipo, String tipoPago,
            int diasPago, String estadoOrden,
            char estadoRegistro, String usrCreacion, Date fecCreacion) {
        this.id = id;
        this.tipo = tipo;
        this.tipoPago = tipoPago;
        this.diasPago = diasPago;
        this.estadoOrden = estadoOrden;
        this.estadoRegistro = estadoRegistro;
        this.usrCreacion = usrCreacion;
        this.fecCreacion = fecCreacion;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public char getTipo() {
        return tipo;
    }

    public void setTipo(char tipo) {
        this.tipo = tipo;
    }

    public String getServicio() {
        return servicio;
    }

    public void setServicio(String servicio) {
        this.servicio = servicio;
    }

    public String getCategoria() {
        return categoria;
    }

    public void setCategoria(String categoria) {
        this.categoria = categoria;
    }

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public Date getFechaEmision() {
        return fechaEmision;
    }

    public void setFechaEmision(Date fechaEmision) {
        this.fechaEmision = fechaEmision;
    }

    public String getContacto() {
        return contacto;
    }

    public void setContacto(String contacto) {
        this.contacto = contacto;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    public BigDecimal getSubtotal() {
        return subtotal;
    }

    public void setSubtotal(BigDecimal subtotal) {
        this.subtotal = subtotal;
    }

    public BigDecimal getIgv() {
        return igv;
    }

    public void setIgv(BigDecimal igv) {
        this.igv = igv;
    }

    public BigDecimal getTotal() {
        return total;
    }

    public void setTotal(BigDecimal total) {
        this.total = total;
    }

    public Date getPlazoEntrega() {
        return plazoEntrega;
    }

    public void setPlazoEntrega(Date plazoEntrega) {
        this.plazoEntrega = plazoEntrega;
    }
    
    public Date getFechaCierre() {
        return fechaCierre;
    }

    public void setFechaCierre(Date fechaCierre) {
        this.fechaCierre = fechaCierre;
    }

    public String getExpresionTotal() {
        return expresionTotal;
    }

    public void setExpresionTotal(String expresionTotal) {
        this.expresionTotal = expresionTotal;
    }

    public Integer getDiasPlazo() {
        return diasPlazo;
    }

    public void setDiasPlazo(Integer diasPlazo) {
        this.diasPlazo = diasPlazo;
    }

    public String getLugarEntrega() {
        return lugarEntrega;
    }

    public void setLugarEntrega(String lugarEntrega) {
        this.lugarEntrega = lugarEntrega;
    }

    public String getTipoPago() {
        return tipoPago;
    }

    public void setTipoPago(String tipoPago) {
        this.tipoPago = tipoPago;
    }


    public Integer getDiasPago() {
        return diasPago;
    }

    public void setDiasPago(Integer diasPago) {
        this.diasPago = diasPago;
    }

    public Integer getDiasLibres() {
        return diasLibres;
    }

    public void setDiasLibres(Integer diasLibres) {
        this.diasLibres = diasLibres;
    }

    public String getDetallePago() {
        return detallePago;
    }

    public void setDetallePago(String detallePago) {
        this.detallePago = detallePago;
    }

    public String getEstadoOrden() {
        return estadoOrden;
    }

    public void setEstadoOrden(String estadoOrden) {
        this.estadoOrden = estadoOrden;
    }

    public char getEstadoRegistro() {
        return estadoRegistro;
    }

    public void setEstadoRegistro(char estadoRegistro) {
        this.estadoRegistro = estadoRegistro;
    }
    
    public String getUsrEmision() {
        return usrEmision;
    }

    public void setUsrEmision(String usrEmision) {
        this.usrEmision = usrEmision;
    }
    
    public String getUsrCreacion() {
        return usrCreacion;
    }

    public void setUsrCreacion(String usrCreacion) {
        this.usrCreacion = usrCreacion;
    }

    public Date getFecCreacion() {
        return fecCreacion;
    }

    public void setFecCreacion(Date fecCreacion) {
        this.fecCreacion = fecCreacion;
    }

    public String getUsrModificacion() {
        return usrModificacion;
    }

    public void setUsrModificacion(String usrModificacion) {
        this.usrModificacion = usrModificacion;
    }

    public Date getFecModificacion() {
        return fecModificacion;
    }

    public void setFecModificacion(Date fecModificacion) {
        this.fecModificacion = fecModificacion;
    }

    public TipoMoneda getIdTipoMoneda() {
        return idTipoMoneda;
    }

    public void setIdTipoMoneda(TipoMoneda idTipoMoneda) {
        this.idTipoMoneda = idTipoMoneda;
    }

    public Proveedor getIdProveedor() {
        return idProveedor;
    }

    public void setIdProveedor(Proveedor idProveedor) {
        this.idProveedor = idProveedor;
    }

    public OrdenPedido getIdOrdenPedido() {
        return idOrdenPedido;
    }

    public void setIdOrdenPedido(OrdenPedido idOrdenPedido) {
        this.idOrdenPedido = idOrdenPedido;
    }

    public CategoriaArticulo getIdCategoriaArticulo() {
        return idCategoriaArticulo;
    }

    public void setIdCategoriaArticulo(CategoriaArticulo idCategoriaArticulo) {
        this.idCategoriaArticulo = idCategoriaArticulo;
    }

    public Collection<DetalleOrdenCompraServicio> getDetalleOrdenCompraServicioCollection() {
        return detalleOrdenCompraServicioCollection;
    }

    public void setDetalleOrdenCompraServicioCollection(
            Collection<DetalleOrdenCompraServicio> detalleOrdenCompraServicioCollection) {
        this.detalleOrdenCompraServicioCollection = detalleOrdenCompraServicioCollection;
    }
    
    public String getObservacion() {
        return observacion;
    }

    public void setObservacion(String observacion) {
        this.observacion = observacion;
    }
    
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are
        // not set
        if (!(object instanceof OrdenCompraServicio)) {
            return false;
        }
        OrdenCompraServicio other = (OrdenCompraServicio) object;
        if ((this.id == null && other.id != null)
                || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "pe.com.cotelasa.scp.entidad.OrdenCompraServicio[ id=" + id
                + " ]";
    }

    public String getDescTipoOrden() {
        return (tipo == 'C' ? "COMPRA" : "SERVICIO");
    }

    @Transient
    public Collection<GuiaRemision> getGuiaRemisionCollection() {
        return guiaRemisionCollection;
    }

    public void setGuiaRemisionCollection(Collection<GuiaRemision> guiaRemisionCollection) {
        this.guiaRemisionCollection = guiaRemisionCollection;
    }
    
    public Empresa getIdEmpresa() {
        return idEmpresa;
    }

    public void setIdEmpresa(Empresa idEmpresa) {
        this.idEmpresa = idEmpresa;
    }

    
}
